package jp.ac.waseda.cs.washi.game.api;

import jp.ac.waseda.cs.washi.gameaiarena.api.Direction4;
import jp.ac.waseda.cs.washi.gameaiarena.api.Point2;

/**
 * このインタフェースはマップに関する情報を提供します。
 */
public interface MapInfo {
	/**
	 * このマップの横幅（タイルの数）を返します。
	 * 
	 * @return このマップの横幅（タイルの数）
	 */
	int getWidth();

	/**
	 * このマップの縦幅（タイルの数）を返します。
	 * 
	 * @return このマップの縦幅（タイルの数）
	 */
	int getHeight();

	/**
	 * 指定された開始位置から指定された目的地まで到達するための経路を示す方向の配列を返します。
	 * 指定された開始位置と目的地が等しい場合、空の配列を返します。 目的地に到達できない場合、nullを返します。
	 * 
	 * @param from
	 *            開始位置の座標
	 * @param to
	 *            目的地の座標
	 * @return 指定された開始位置から指定された目的地まで到達するための経路を示す方向の配列、開始位置から目的地へ到達不可能な場合はnull
	 */
	Direction4[] getPath(Point2 from, Point2 to);

	/**
	 * 指定された座標がマップ内の座標か判定します。
	 * 
	 * @param location
	 *            目的の座標
	 * @return 指定された座標がマップ内の場合はtrue、そうでない場合はfalse
	 */
	boolean isAvailable(Point2 location);

	/**
	 * 指定された座標がマップ内の座標か判定します。
	 * 
	 * @param x
	 *            x座標
	 * @param y
	 *            y座標
	 * @return 指定された座標がマップ内の場合はtrue、そうでない場合はfalse
	 */
	boolean isAvailable(int x, int y);

	/**
	 * 指定されたキャラクタが指定された方向のマスに移動可能か判定します。 (このメソッドはマップのみを判定し、キャラクタの状態は考慮しません。)
	 * 
	 * @param charaInfo
	 *            キャラクタ
	 * @param direction
	 *            方向
	 * @return 指定されたキャラクタが指定された方向に移動可能な場合はtrue、そうでない場合はfalse
	 */
	boolean isMovable(CharaInfo charaInfo, Direction4 direction);

	/**
	 * 指定された座標のマスが移動可能なマスか判定します。 (このメソッドはマップのみを判定し、キャラクタの状態は考慮しません。)
	 * 
	 * @param location
	 *            対象となるマスの座標
	 * @return 指定された座標のマスが移動可能な場合はtrue、そうでない場合はfalse
	 */
	boolean isMovable(Point2 location);

	/**
	 * 指定された座標のマスが移動可能なマスか判定します。 (このメソッドはマップのみを判定し、キャラクタの状態は考慮しません。)
	 * 
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return 指定された座標のマスが移動可能な場合はtrue、そうでない場合はfalse
	 */
	boolean isMovable(int x, int y);

	/**
	 * 指定された座標のマスに完成魔方陣を作ったキャラクタ情報を返します。
	 * 
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return 指定された座標のマスに完成魔方陣を作ったキャラクタ情報、完成魔方陣がない場合はnull
	 */
	public CharaInfo getCompleteOwner(int x, int y);

	/**
	 * 指定された座標のマスに完成魔方陣を作ったキャラクタ情報を返します。
	 * 
	 * @param p
	 *            対象となるマスの座標
	 * @return 指定された座標のマスに完成魔方陣を作ったキャラクタ情報、完成魔方陣がない場合はnull
	 */
	public CharaInfo getCompleteOwner(Point2 p);

	/**
	 * 指定された座標に強度が1以上の魔方陣を作ったキャラクタ情報を返します。
	 * 
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return 指定された座標に強度が1以上の魔方陣を作ったキャラクタ情報、魔方陣がない無地の場合はnull
	 */
	public CharaInfo getOwner(int x, int y);

	/**
	 * 指定された座標に強度が1以上の魔方陣を作ったキャラクタ情報を返します。
	 * 
	 * @param p
	 *            対象となるマスの座標
	 * @return 指定された座標に強度が1以上の魔方陣を作ったキャラクタ情報、魔方陣がない無地の場合はnull
	 */
	public CharaInfo getOwner(Point2 p);

	/**
	 * 指定された座標のマスが壁かどうかを判定します。
	 * 
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return マスが壁である場合はtrue、そうでない場合はfalse
	 */
	public boolean isWall(int x, int y);

	/**
	 * 指定された座標のマスが壁かどうかを判定します。
	 * 
	 * @param p
	 *            対象となるマスの座標
	 * @return マスが壁である場合はtrue、そうでない場合はfalse
	 */
	public boolean isWall(Point2 p);

	/**
	 * 指定された座標のマスが開発できるか判定します。 （ボーナス図形を構成するパンプキンマス以外のマスは開発できません。）
	 * 
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return マスが開発できない場合はtrue、それ以外の場合はfalse
	 */
	public boolean canDevelop(int x, int y);

	/**
	 * 指定された座標のマスが開発できるか判定します。 （ボーナス図形を構成するパンプキンマス以外のマスは開発できません。）
	 * 
	 * @param p
	 *            対象となるマスの座標
	 * @return マスが開発できない場合はtrue、それ以外の場合はfalse
	 */
	public boolean canDevelop(Point2 p);

	/**
	 * 指定された座標のマスを指定されたキャラクタが完全に開発するために必要な詠唱回数を返します。
	 * (0である場合は、マスが完全に開発済みであることを含め、指定されたマスを開発できないことを示します。)
	 * 
	 * @param charaInfo
	 *            対象となるキャラクタ
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return 指定された座標のマスを指定されたキャラクタが完全に開発するために必要な詠唱回数
	 */
	public int getRequiredDevelopCount(CharaInfo charaInfo, int x, int y);

	/**
	 * 指定された座標のマスを指定されたキャラクタが完全に開発するために必要な詠唱回数を返します。
	 * (0である場合は、マスが完全に開発済みであることを含め、指定されたマスを開発できないことを示します。)
	 * 
	 * @param charaInfo
	 *            対象となるキャラクタ
	 * @param p
	 *            対象となるマスの座標
	 * @return 指定された座標のマスを指定されたキャラクタが完全に開発するために必要な詠唱回数
	 */
	public int getRequiredDevelopCount(CharaInfo charaInfo, Point2 p);

	/**
	 * 指定された座標のマスの強度を返します。 未開発の場合は0、開発済みの場合は開発した度合い、パンプキンマスの場合は破壊に必要な詠唱回数を返します。
	 * 
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return 指定されたマスの強度
	 */
	public int getStrength(int x, int y);

	/**
	 * 指定された座標のマスの強度を返します。 未開発の場合は0、開発済みの場合は開発した度合い、パンプキンマスの場合は破壊に必要な詠唱回数を返します。
	 * 
	 * @param p
	 *            対象となるマスの座標
	 * @return 指定されたマスの強度
	 */
	public int getStrength(Point2 p);

	/**
	 * 指定した座標のマスが完成魔方陣か否かを取得します。
	 * @param x
	 *            対象となるマスのx座標
	 * @param y
	 *            対象となるマスのy座標
	 * @return　完成魔方陣か否か
	 */
	boolean isCompleted(int x, int y);

	/**
	 * 指定した座標のマスが完成魔方陣か否かを取得します。
	 * @param p
	 *            対象となるマスの座標
	 * @return　完成魔方陣か否か
	 */
	boolean isCompleted(Point2 p);
}
